#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
typedef unsigned long long ll;
using namespace std;


//int t,n;
//int b[105];
//void solve() {
//	cin >> n;
//	for (int i = 2; i < n; i++) {
//		cin >> b[i];
//	}
//	if (n <= 4) {
//		cout << "YES" << '\n';
//		return;
//	}
//	for (int i = 3; i < n-1; i++) {
//		if (b[i - 1] == 1 && b[i] == 0 && b[i + 1] == 1) {
//			cout << "NO" << '\n';
//			return;
//		}
//	}
//	cout << "YES" << '\n';
//	return;
//}

//
//int t, n, m;
//int code[705][705];
//bool strange[705][705];
//int sum[705][705];

//int t, n;
//const int mod = 998244353;
//int a[200005];
//ll ans;
//vector<int> ones;
//vector<int> twos;
//vector<int> threes;
//vector<ll> prefix_twos;
//
//ll mod_exp(ll base, ll exp, ll mod) {
//    ll result = 1;
//    while (exp > 0) {
//        if (exp % 2 == 1) {
//            result = (result * base) % mod;
//        }
//        base = (base * base) % mod;
//        exp /= 2;
//    }
//    return result;
//}
//
//ll cnt(int l, int r) {
//    int c = upper_bound(twos.begin(), twos.end(), r) - lower_bound(twos.begin(), twos.end(), l);
//    ll sum = (mod_exp(2, c, mod) - 1 + mod) % mod;
//    return sum;
//}
//
//void solve() {
//    cin >> n;
//    ans = 0;
//    ones.clear(), twos.clear(), threes.clear();
//    for (int i = 1; i <= n; i++) {
//        cin >> a[i];
//        if (a[i] == 1)
//            ones.push_back(i);
//        else if (a[i] == 2)
//            twos.push_back(i);
//        else
//            threes.push_back(i);
//    }
//
//    prefix_twos.resize(n + 1, 0);
//    for (int i = 1; i <= n; i++) {
//        prefix_twos[i] = prefix_twos[i - 1] + (a[i] == 2 ? 1 : 0);
//    }
//
//    int n = ones.size();
//    int m = threes.size();
//    for (int i = 0; i < n; i++) {
//        for (int j = m-1; j >= 0; j--) {
//            if (ones[i] < threes[j]) {
//                int l = ones[i];
//                int r = threes[j];
//                int c = prefix_twos[r] - prefix_twos[l - 1];
//                ll tmp = (mod_exp(2, c, mod) - 1 + mod) % mod;
//                ans = (ans + tmp) % mod;
//            }
//            else {
//                break;
//            }
//        }
//    }
//    cout << ans << '\n';
//    return;
//}
//
//int main() {
//    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//    cin >> t;
//    while (t--) {
//        solve();
//    }
//
//    return 0;
//}..

//class Solution {
//public:
//    int maxDistance(vector<vector<int>>& arrays) {
//        int maxn[505], minn[505];
//        int n = arrays.size();
//        for (int i = 0; i < n; i++) {
//            int m = arrays[i].size();
//            maxn[i] = arrays[i][m - 1];
//            minn[i] = arrays[i][0];
//        }
//        int ans = -1;
//        for (int i = 0; i < n; i++) {
//            for (int j = 0; j < n; i++) {
//                if (i != j) {
//                    ans = max(ans, maxn[i] - minn[j]);
//                }
//            }
//        }
//        return ans;
//    }
//};


class Solution {
    struct maxn {
        int val, index;
        bool operator<(const maxn& x) const {
            return x.val > val;
        }
    };
    struct minn {
        int val, index;
        bool operator<(const minn& x) const {
            return x.val < val;
        }
    };

public:
    int maxDistance(vector<vector<int>>& arrays) {
        int n = arrays.size();
        priority_queue<maxn> q1;
        priority_queue<minn> q2;
        for (int i = 0; i < n; i++) {
            q2.push({ arrays[i][0],i });
            int m = arrays[i].size();
            q1.push({ arrays[i][m - 1],i });
        }
        int ans = -1;
        while(!q1.empty()){
            auto x = q1.top(); q1.pop();
            auto y = q1.top(); q1.pop();
            while(!q2.empty()){
                auto z = q2.top(); q2.pop();
                if (z.index != x.index)
                    ans = max(ans, x.val - z.val);
                if (z.index != y.index)
                    ans = max(ans, y.val - z.val);
            }
            break;
        }
        return ans;
    }
};

int main() {
    Solution sol;
    vector<vector<int>> arrays = { {1,2,3} ,{4,5},{1,2,3} };
    cout << sol.maxDistance(arrays) << endl;
    return 0;
}